import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;

public class Parser {
    //先指定一个加载文档的路径
    private static final String INPUT_PATH = "D:/Java.Project/Project_MySearcher/docs/api";

    public void run() {
        //整个parser的入口
        //1.根据指定的路径，枚举出该路径所有的文件，这个过程需要把所有子目录的文件都能获取到
        ArrayList<File> fileList = new ArrayList<File>();
        enumFile(INPUT_PATH, fileList);
//        System.out.println(fileList);
//        System.out.println(fileList.size());
        //2.针对上面罗列出的文件的路径，打开文件，读取文件内容，并进行解析，构建索引
        for (File f : fileList) {
            //通过parseHTML解析单个的HTML文件
            System.out.println("开始解析："+f.getAbsolutePath());
            parseHTML(f);
        }
        //3.把在内存中构造的索引数据结构，保存到指定的文件中

    }

    private void parseHTML(File f) {
        //1.解析出HTML的标题
        String title=parseTitle(f);
        //2.解析出HTML对应的URL
        String url=parseUrl(f);
        //3.解析出HTML对应的正文
        String content=parseContent(f);

        //4.TODO 把内存中构造好的索引数据结构保存到指定文件中
    }

    private String parseContent(File f) {
        //先按照一个字符一个字符的方式来读取，以<和>来控制拷贝的开关
        try {
            FileReader fileReader = new FileReader(f);
            //加上一个是否要进行拷贝的开关
            boolean isCopy = true;
            //还要准备保存结果的StringBuilder
            StringBuilder content = new StringBuilder();

            while (true) {
                //返回值为int，为了表示非法操作
                int ret = fileReader.read();

                if(ret==-1){
                    break;
                }

                //如果不是-1就是合法的字符
                char c = (char)ret;
                if(isCopy){
                    if (c=='<'){
                        isCopy=false;
                        continue;
                    }
                    if(c=='\n'||c=='\r'){
                        c=' ';
                    }
                    //其他字符直接拷贝
                    content.append(c);
                }else{
                    if(c=='>'){
                        isCopy=true;
                    }
                }
            }
            fileReader.close();
            return content.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    private String parseUrl(File f) {
        String part1 = "https://docs.oracle.com/javase/8/docs/api/";
        String part2 = f.getAbsolutePath().substring(INPUT_PATH.length());
        return part1 + part2;
    }

    private String parseTitle(File f) {

        String name=f.getName();
        return name.substring(0,name.length()-".html".length());
    }

    //第一个参数表示从哪个目录开始进行递归遍历
    //第二个参数表示递归结果
    private void enumFile(String inputPath, ArrayList<File> fileList) {
        File rootPath = new File(inputPath);
        //listFiles获取当前rootPAth当前目录下包含的文件
        //使用listFiles只能看到一级目录，要想看到子目录内容还需要递归
        File[] files = rootPath.listFiles();
        for (File f : files) {
            //根据f类型判断是否递归
            //如果f普通文件，就把f假如到fileList结果中
            //如果是目录就继续递归
            if (f.isDirectory()) {
                enumFile(f.getAbsolutePath(), fileList);
            } else {
                if (f.getAbsolutePath().endsWith(".html")) {
                    fileList.add(f);
                }
            }
        }

    }


    public static void main(String[] args) {
        //通过main方法实现整个制作索引的过程
        Parser parser = new Parser();
        parser.run();
    }
}

